package com.cn.utils;

import com.cn.po.WordWL;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ExcelReaderUtil {
    // 读取王陆excel
    public static List<WordWL> readExcelForWL(String filePath) {
        List<WordWL> wordsList = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0); // 假设要读取第一个Sheet
            for (Row row : sheet) {
                if (row.getRowNum() == 0) continue; // 跳过标题行
                Integer id = Integer.valueOf(getCellValueAsString(row.getCell(0)));
                String englishWord = getCellValueAsString(row.getCell(1));
                String wangLuMeaning = getCellValueAsString(row.getCell(2));
                String youDaoMeaning = "";
                String usPhonetic = "";
                String ukPhonetic = "";
                String usVoice;
                String ukVoice;
                //如果是单词
                if(WordOrPhraseChecker.checkWordOrPhrase(englishWord) == 1){
                    try{
                        HashMap<String, String> wordAllMessage = EnglishWordUtil.getWordAllMessage(englishWord);
                        usPhonetic = wordAllMessage.get("usPhonetic");
                        ukPhonetic = wordAllMessage.get("ukPhonetic");
                        usVoice = wordAllMessage.get("usVoice");
                        ukVoice = wordAllMessage.get("ukVoice");
                        youDaoMeaning = wordAllMessage.get("meanings");
                    }catch(Exception e){
                        usVoice = EnglishWordUtil.getUsWordVoice(englishWord);
                        ukVoice = EnglishWordUtil.getUkWordVoice(englishWord);
                    }
                }else{
                    usVoice = EnglishSentenceUtil.getUsSentenceVoice(englishWord);
                    ukVoice = EnglishSentenceUtil.getUkSentenceVoice(englishWord);
                }
                String chapter = getCellValueAsString(row.getCell(3));
                String remark = "";
                Integer errorCount = 0;
                WordWL wordWL = new WordWL(id, englishWord, usPhonetic, usVoice, ukPhonetic, ukVoice, youDaoMeaning,wangLuMeaning,chapter, remark, errorCount);
                //System.out.println(wordWL);
                wordsList.add(wordWL);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return wordsList;
    }

    //public static List<Word> readExcel(String filePath) {
    //    List<Word> wordsList = new ArrayList<>();
    //
    //    try (FileInputStream fis = new FileInputStream(filePath);
    //         Workbook workbook = new XSSFWorkbook(fis)) {
    //
    //        Sheet sheet = workbook.getSheetAt(0); // 假设要读取第一个Sheet
    //        for (Row row : sheet) {
    //            if (row.getRowNum() == 0) continue; // 跳过标题行
    //            Integer id = Integer.valueOf(getCellValueAsString(row.getCell(0)));
    //            String englishWord = getCellValueAsString(row.getCell(1));
    //            String meaning = getCellValueAsString(row.getCell(2));
    //            String usPhonetic = "";
    //            String ukPhonetic = "";
    //            String chapter = getCellValueAsString(row.getCell(3));
    //            String remark = "";
    //            Integer errorCount = 0;
    //            //Word word = new Word(id, englishWord, meaning, usPhonetic, usWordVoice, ukPhonetic, ukWordVoice, remark;
    //            //wordsList.add(word);
    //        }
    //    } catch (IOException e) {
    //        e.printStackTrace();
    //    }
    //    return wordsList;
    //}

    /**
     * 整数情况：如果numericValue是1.0：
     * (int) 1.0将其转换为整数1。
     * 	1.0 == 1为true，所以将它转换为字符串"1"并返回。
     * 	小数情况：如果numericValue是1.5：
     * 	(int) 1.5将其转换为整数1。
     * 	1.5 == 1为false，所以程序会输出”小数”，并将1.5转换为字符串"1.5"并返回。
     * @return String
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }

        /*
        numericValue == (int) numericValue：
		numericValue是double类型的数值（可能是整数或小数）。
		(int) numericValue：这是将numericValue强制转换为int类型。强制转换会舍弃小数部分，只保留整数部分。
		比较：numericValue == (int) numericValue这部分检查原始的numericValue和强制转换为int的值是否相等。
		如果相等，说明这个数本身就是一个整数（比如1.0）。
		如果不相等，说明这个数是一个小数（比如1.5）。
	2.	如果是整数：
		当numericValue == (int) numericValue为true时，意味着这个数是整数，比如1.0。
		(int) numericValue：将double类型的数值转换为int类型去除小数部分。
		String.valueOf((int) numericValue)：将整数转换为字符串，比如1.0会被转换为1。
	3.	如果是小数：
		当numericValue == (int) numericValue为false时，说明这个数是一个小数，比如1.5。
		System.out.println("小数");：输出”小数”以便调试时知道处理的是小数。
		String.valueOf(numericValue)：直接将double类型的浮点数值转换为字符串，比如1.5会被转换为字符串"1.5"。
         */

        switch (cell.getCellType()) {
            case STRING:
                //System.out.println("String:"+cell.getStringCellValue());
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString(); // 处理日期类型
                } else {
                    double numericValue = cell.getNumericCellValue();
                    // 判断是否是整数类型
                    if (numericValue == (int) numericValue) {
                        //System.out.println("整数:"+numericValue);
                        return String.valueOf((int) numericValue); // 如果是整数，转换为整数字符串
                    } else {
                        //System.out.println("小数"+numericValue);
                        return String.valueOf(numericValue); // 如果是小数，返回浮点数字符串
                    }
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }

    public static void main(String[] args) {
        //String filePath = "BampleV0/src/main/resources/wordfiles/王陆雅思词汇.xlsx";
        String filePath = "BampleV0/src/main/resources/wordfiles/words2.xlsx";
        List<WordWL> words = ExcelReaderUtil.readExcelForWL(filePath);

    }
}